-- 脚本对象
local key = KEYS[1]  -- 获取脚本第一个键名参数
-- 窗口大小
local window = tonumber(ARGV[1])  -- tonumber将字符串转为数字类型  ARGV 获取传入脚本的非键参数
-- 阈值
local threshold = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
-- 唯一ID，用于解决同一时间内多个请求只统计一次的问题
-- SEE: issue #27
local uid = ARGV[4]
-- 窗口起始时间
local min = now - window
redis.call("ZREMRANGEBYSCORE", key, '-inf', min)
local cnt = redis.call("ZCOUNT", key, '-inf', '+inf')
if cnt > threshold then
    -- 执行限流
    return 'true'
else
    -- score 设置为当前时间，member设置为唯一id
    redis.call("ZADD", key, now, uid)
    redis.call("PEXPIRE", key, window)
    return 'false'
end